package libra;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.nacos.api.config.annotation.NacosConfigListener;
import com.alibaba.nacos.api.config.annotation.NacosConfigurationProperties;
import com.alibaba.nacos.api.config.annotation.NacosValue;

import libra.init.Config;
import libra.nacosPlugins.ConfigConverter;

/**
 * 基于Nacos提供的注解，实现注解式自动的应用方式
 */
@RestController
@RequestMapping("Auto")
public class AutoController {
	
	/**
	 * 使用@NacosValue与@Value的效果一致，均能获取NacosConfig中的指定配置
	 * 原因是@EnableNacosConfig注解会把指定dataId的配置项拉取到应用，并封装为PropertySource对象添加到Environment对象中
	 * 所以@Value也能读取到相应的配置项。
	 */
	@NacosValue("${msg}")
	private String msg;
	// 'autoRefreshed'为动态刷新属性，默认为false(关闭)。注意!：该自动刷新针对的是'当前属性绑定'
	@NacosValue(value = "${refresh}", autoRefreshed = true)
	private String refresh;
	@Value("${version}")
	private Double version;
	
	@RequestMapping("getData")
	public Object getDate(HttpServletRequest req, HttpServletResponse resp) {
		return new HashMap<>() {{
			put("resp_msg", msg);
			put("resp_refresh", refresh);
			put("resp_version", version);
		}};
	}
	
	
	/**
	 * 为指定dataId的配置文件添加监听器，使用默认的类型转换器，入参类型一般选择String(配置文件的文本内容)
	 * 		但是可以根据实际的配置文件数据格式，还可以选择Map<String,String>(json格式、properties格式、xml格式、yaml格式)
	 * 		底层的默认Converter处理在DefaultNacosConfigConverter。!!!：其返回Map，KV均是String类型，需要手动转换数值类型
	 * 运行Converter可能需要一些时间，可以通过@NacosConfigListener(timeout[ms])属性设置最大执行时间，以防止它阻塞其他侦听器
	 */
	@NacosConfigListener(dataId = Config.dataId, timeout = 500)
	public void onModify( Map content ) {
		System.out.println( "onModify()触发。"+ Config.dataId + "最新内容：\r\n" + content );
	}
	/**
	 * 为指定dataId的配置文件添加监听器，并提供自定义扩展的类型转换器，入参类型为自定义转换器定义的结果类型
	 * 		如果'该处理方法的入参类型'与'自定义Converter的定义结果类型'不一致
	 * 		可能会导致自定义Converter的canConvert()判断不成功，而不进行自定义类型转换
	 * 运行Converter可能需要一些时间，可以通过@NacosConfigListener(timeout[ms])属性设置最大执行时间，以防止它阻塞其他侦听器
	 */
	@NacosConfigListener(dataId = Config.dataId, converter = ConfigConverter.class, timeout = 1000 )
	public void onConverter( Map content ) {
		System.out.println( "onModify()触发。"+ Config.dataId + "最新内容：\r\n" + content );
	}
}
